grammar Calculator;

@header{
import java.util.*;
}

@parser::members{
Map<String, Integer> memory = new HashMap<>();

int eval(int left, int op, int right){
	switch(op){
		case MUL : return left*right;
		case DIV : return left/right;
		case ADD : return left+right;
		case SUB : return left-right;
	}
	return 0;
}
}


e returns [int v]
	: a=e op=(MUL|DIV) b=e {$v = eval($a.v, $op.type, $b.v);}
	| a=e op=(ADD|SUB) b=e {$v = eval($a.v, $op.type, $b.v);}
	| INT                  {$v = $INT.int;}
	| ID
	 {
	 	String id = $ID.text;
	 	$v = memory.containsKey(id) ? memory.get(id) : 0;
	 }
	| LEFTON e RIGHTON            {$v = $e.v;}
	;



MUL  : '*';
DIV  : '/';
ADD  : '+';
SUB  : '-';

LEFTON  : '(';
RIGHTON   : ')';

INT : [0-9]+;
ID  : [a-zA-Z]+;

WS : [ \t\r\n]+ -> skip;
